/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import bentity.beLineaIngresos;
import bentity.beLineaKardex;
import bentity.bePallet;
import bentity.beProducto;
import bentity.beTipoProducto;
import bentity.beUbicacion;
import blogic.blPallet;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author chokewanka
 */
public class daoProducto {

    public ArrayList<beProducto> busquedaProductosDAO(String nombreProducto,Double costoProducto,int tipoProducto,int proveedorProducto) throws Exception{

        Connection conn = daoHelper.dameConexion();

        String cadenaSelect="SELECT PD.*";
        String cadenaFrom=" FROM PRODUCTO PD, DATOS_COMBO CMB";
        String cadenaWhere=" WHERE PD.ESTADO_PRODUCTO= CMB.ID_DATO AND CMB.NOMBRE_DATO=? AND CMB.NOMBRE_COMBO=?";
        int[] contador=new int[6];
        contador[0]=1;
        contador[1]=1;

        if(!nombreProducto.equals("")){
            cadenaWhere+=" AND UPPER(PD.NOMBRE) LIKE UPPER('%'||?||'%')";
            contador[2]=1;
        }

        if(costoProducto>=0){
            cadenaWhere+=" AND PD.PRECIO = ?";
            contador[3]=1;
        }

        if(tipoProducto>0){
            cadenaFrom+=", TIPO_PRODUCTO TP";
            cadenaWhere+=" AND PD.ID_TIPO_PRODUCTO = TP.ID_TIPO_PRODUCTO AND TP.ID_TIPO_PRODUCTO = ?";
            contador[4]=1;
        }

        if(proveedorProducto>0){
            cadenaFrom+=", PROVEEDOR PV, PROVEEDOR_X_PRODUCTO PXP";
            cadenaWhere+="AND PD.ID_PRODUCTO= PXP.ID_PRODUCTO AND PXP.ID_PROVEEDOR = PV.ID_PROVEEDOR AND PV.ID_PROVEEDOR = ?";
            contador[5]=1;
        }

        PreparedStatement ps = conn.prepareStatement(cadenaSelect+cadenaFrom+cadenaWhere);

        int j=0;
        for(int i=0; i<6; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setString(j,beProducto.nombreActivo);
                        break;
                    case 1:
                        ps.setString(j,beProducto.nombreCombo);
                        break;
                    case 2:
                        ps.setString(j,nombreProducto);
                        break;
                    case 3:
                        ps.setDouble(j,costoProducto);
                        break;
                    case 4:
                        ps.setInt(j,tipoProducto);
                        break;
                    case 5:
                        ps.setInt(j,proveedorProducto);
                        break;
                }
            }
        }

        ResultSet rs = ps.executeQuery();
//        System.out.println("IDUSUARIO\tNOMBRE\tPASSWORD\tESTADO\tCARGO");
//        while(rs.next())
//            System.out.println(rs.getInt(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3) + "\t"+rs.getString(4)+"\t"+rs.getString(5))

        ArrayList<beProducto> clientes = new ArrayList<beProducto>();
        beProducto pd = null;
        while (rs.next()){
            pd = new beProducto(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getDouble(4),rs.getInt(5),rs.getInt(6));
            clientes.add(pd);
        }
        rs.close();
        ps.close();
        conn.close();
        return clientes;

    }

    public beProducto busquedaProductosPorID(int idProducto) throws Exception{
        beProducto p = null;
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT A.*, B.DESCRIPCION FROM PRODUCTO A LEFT JOIN TIPO_PRODUCTO B ON(A.ID_TIPO_PRODUCTO = B.ID_TIPO_PRODUCTO) WHERE ID_PRODUCTO = ? AND ESTADO_PRODUCTO = 5 ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,idProducto);
        ResultSet rs = ps.executeQuery();
        if (rs.next()){
            p = new beProducto(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getDouble(4),rs.getInt(5),rs.getInt(6));
            p.setDescTipoProducto(rs.getString(8));
        }
        rs.close();
        ps.close();
        conn.close();
        return p;
    }

    public ArrayList<beProducto> busquedaProductosPorNombre(String cadBusqueda) throws Exception{
        ArrayList<beProducto> productos = new ArrayList<beProducto>();
        beProducto p = null;
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT A.*,B.DESCRIPCION FROM PRODUCTO A LEFT JOIN TIPO_PRODUCTO B ON (A.ID_TIPO_PRODUCTO = B.ID_TIPO_PRODUCTO) WHERE NOMBRE LIKE '%'||?||'%' AND ESTADO_PRODUCTO = 5";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,cadBusqueda);
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            p = new beProducto(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getDouble(4),rs.getInt(5),rs.getInt(6));
            p.setDescTipoProducto(rs.getString(8));
            productos.add(p);
        }
        rs.close();
        ps.close();
        conn.close();
        return productos;
    }
    //Renzo, soy Jusfral. Yo cambie en las lineas 107 y 123
    //en el ultimo elemento: En vez de "beProducto.estadoActvo" puse rs.getInt(6)
    //Es que hice unos cambios en el beProducto, y por consiguiente salió en esas lineas.
    //No se si los cambios en el beProducto esten bien, porque aun no entiendo bien lo de datosCombo

    public ArrayList<beTipoProducto> todosLosTipoProducto() throws Exception {
        ArrayList<beTipoProducto> tipoProductos = new ArrayList<beTipoProducto>();
        beTipoProducto tp = null;
        Connection conn = daoHelper.dameConexion();
        String sql = "SELECT * FROM TIPO_PRODUCTO";
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            tp = new beTipoProducto(rs.getInt(1),rs.getString(2));
            tipoProductos.add(tp);
        }
        rs.close();
        ps.close();
        conn.close();
        return tipoProductos;
    }

    public int registrarProducto(beProducto pd) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "INSERT INTO PRODUCTO (id_producto,nombre,descripcion,precio,id_tipo_producto,estado_producto) VALUES(?,?,?,?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);

            int nuevoId=daoHelper.getNextId("PRODUCTO", "ID_PRODUCTO");

            ps.setInt(1, nuevoId);
            ps.setString(2, pd.getNombre());
            ps.setString(3, pd.getDescripcion());
            ps.setDouble(4, pd.getCosto());
            ps.setInt(5, pd.getTipoProducto());
            ps.setInt(6, pd.getEstadoProducto());
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return nuevoId;

    }

    public int registrarProductoConStock(beProducto pd) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "INSERT INTO PRODUCTO (id_producto,nombre,descripcion,precio,id_tipo_producto,stock,estado_producto) VALUES(?,?,?,?,?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);

            int nuevoId=daoHelper.getNextId("PRODUCTO", "ID_PRODUCTO");

            ps.setInt(1, nuevoId);
            ps.setString(2, pd.getNombre());
            ps.setString(3, pd.getDescripcion());
            ps.setDouble(4, pd.getCosto());
            ps.setInt(5, pd.getTipoProducto());
            ps.setInt(6, pd.getStock());
            ps.setInt(7, pd.getEstadoProducto());
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return nuevoId;

    }

    public int registrarProductoXProveedor(int idProducto, int idProveedor) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "INSERT INTO PROVEEDOR_X_PRODUCTO VALUES(?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, idProducto);
            ps.setInt(2, idProveedor);
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;
    }
//
//    public int devolverNuevoIdProducto() throws Exception{
//            int nuevoId = -1;
//            Connection conn = daoHelper.dameConexion();
//            String sql = "SELECT MAX(PD.ID_PRODUCTO)+1 FROM PRODUCTO PD";
//            PreparedStatement ps = conn.prepareStatement(sql);
//            ResultSet rs = ps.executeQuery();
//            while (rs.next()) {
//                nuevoId = rs.getInt(1);
//            }
//            rs.close();
//            ps.close();
//            conn.close();
//            return nuevoId;
//    }

    public int modificarProducto(beProducto pd) throws Exception{

            Connection conn = daoHelper.dameConexion();
            String sql = "UPDATE PRODUCTO SET nombre=?,descripcion=?,precio=?,id_tipo_producto=?,estado_producto=? WHERE ID_PRODUCTO=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, pd.getNombre());
            ps.setString(2, pd.getDescripcion());
            ps.setDouble(3, pd.getCosto());
            ps.setInt(4, pd.getTipoProducto());
            ps.setInt(5, pd.getEstadoProducto());
            ps.setInt(6, pd.getIdProducto());
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;

    }

    public int eliminarProductoXProveedor(int idProducto, int idProveedor) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "DELETE FROM PROVEEDOR_X_PRODUCTO WHERE ID_PRODUCTO=? AND ID_PROVEEDOR=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, idProducto);
            ps.setInt(2, idProveedor);
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;
        
    }

    public beTipoProducto devuelveTipoProducto(int idTipoProducto) throws Exception{

            beTipoProducto p = null;
            Connection conn = daoHelper.dameConexion();
            String sql = "SELECT * FROM TIPO_PRODUCTO WHERE ID_TIPO_PRODUCTO = ? ";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, idTipoProducto);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                p = new beTipoProducto(rs.getInt(1), rs.getString(2));
            }
            rs.close();
            ps.close();
            conn.close();
            return p;
    }

    public int eliminarProducto(int idProducto) throws Exception{

            beTipoProducto p = null;
            Connection conn = daoHelper.dameConexion();
            String sql = "DELETE FROM PRODUCTO WHERE ID_PRODUCTO=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, idProducto);
            ps.executeUpdate();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;

    }

    public int cambiarEstadoAProducto(int idProducto, int estado) throws Exception{
            Connection conn = daoHelper.dameConexion();
            String sql = "UPDATE PRODUCTO SET estado_producto=? WHERE ID_PRODUCTO=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, estado);
            ps.setInt(2, idProducto);
            ps.executeUpdate();
            ps.close();
            ps.close();
            conn.close();
            return daoHelper.TRANSACCION_EXITOSA;

    }

    public ArrayList<beUbicacion> obtenerUbicacionesDeProductos(ArrayList<beProducto> productosDespacho) throws Exception{
        return null;
    }

    public double obtenerPrecioProducto(int idProducto) throws Exception{
        String sql = "SELECT PRECIO FROM PRODUCTO WHERE ID_PRODUCTO = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, idProducto);
        ResultSet rs = ps.executeQuery();
        double precio = -1.0;
        if (rs.next())
            precio = rs.getDouble(1);
        rs.close();
        ps.close();
        conn.close();
        return precio;
    }

    public int actualizarStock(int id,String motivo) throws SQLException{

        String sql =null;
        Connection conn = daoHelper.dameConexion();
        if (motivo.compareTo("Despacho") == 0){
        sql = "UPDATE PRODUCTO SET STOCK= (SELECT (STOCK - ?) AS DEC FROM PRODUCTO WHERE PRODUCTO.ID_PRODUCTO= PALLET.ID_PRODUCTO) FROM PALLET, UBICACION_X_PALLET WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO AND PALLET.ID_PALLET = UBICACION_X_PALLET.ID_PALLET AND UBICACION_X_PALLET.ID_ORDEN_DESPACHO = ?";
        }

        if (motivo.compareTo("Incidente") == 0){
        sql = "UPDATE PRODUCTO SET STOCK= (SELECT (STOCK - ?) AS DEC FROM PRODUCTO WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO) FROM PALLET , UBICACION_X_PALLET WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO AND PALLET.ID_PALLET = UBICACION_X_PALLET.ID_PALLET AND UBICACION_X_PALLET.ID_PALLET = ?";
        }
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, 1);
        ps.setInt(2, id);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

     public int disminuirStock(int idProducto,int cantidadCajas) throws SQLException{
        String sql =null;
        int idPallet = (new daoPallet()).getPalletxProd(idProducto);
        Connection conn = daoHelper.dameConexion();

        sql = "UPDATE PRODUCTO SET STOCK= (SELECT (STOCK - ? ) AS DEC FROM PRODUCTO WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO) "
            + "FROM PALLET , UBICACION_X_PALLET WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO AND "
            + "PALLET.ID_PALLET = UBICACION_X_PALLET.ID_PALLET AND UBICACION_X_PALLET.ID_PALLET = ?";

        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, cantidadCajas);
        ps.setInt(2, idPallet);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

     public beProducto obtenerProductoSiVence7Dias(int id_Lote, int id_Producto) {
        Connection conexion = daoHelper.dameConexion();
        String sql = "select * from loteproducto where id_lote=? and id_producto=? and fecha_vencimiento<=(current_date + 7)";
        beProducto producto = null;

        try {
            PreparedStatement ps = conexion.prepareStatement(sql);
            ps.setInt(1, id_Lote);
            ps.setInt(2, id_Producto);

            ResultSet rs = ps.executeQuery();
            while (rs.next()){
                producto = new beProducto(rs.getString(2));
            }
            rs.close();
            ps.close();
            conexion.close();
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
            return null;
        }

        return producto;
    }

        public int actualizarStockAgregado(ArrayList<bePallet> arrPallets) throws Exception{

        String sql =null;
        Connection conn = daoHelper.dameConexion();
        int cantCajas=-1;
        int idPall=-1;

        PreparedStatement ps=conn.prepareStatement("SELECT * FROM PRODUCTO");

        for(int i=0;i<arrPallets.size();i++){
            cantCajas=arrPallets.get(i).getCantCajas();
            idPall=arrPallets.get(i).getId_Pallet();

            sql = "UPDATE PRODUCTO SET STOCK = (SELECT (STOCK + "+cantCajas+ ") AS DEC FROM PRODUCTO WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO) FROM PALLET , UBICACION_X_PALLET WHERE PRODUCTO.ID_PRODUCTO = PALLET.ID_PRODUCTO AND PALLET.ID_PALLET = UBICACION_X_PALLET.ID_PALLET AND UBICACION_X_PALLET.ID_PALLET = ?";

            ps = conn.prepareStatement(sql);

            ps.setInt(1, idPall);
            ps.executeUpdate();

        }

        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;


    }

    public ArrayList<beProducto> queryInventaryReport(String strProveedor, String strTipoProducto) throws Exception{
        String sql = "SELECT DISTINCT A.ID_PRODUCTO, A.NOMBRE, B.DESCRIPCION, A.PRECIO, A.STOCK FROM PRODUCTO A, TIPO_PRODUCTO B, PROVEEDOR_X_PRODUCTO C, PROVEEDOR D WHERE A.ID_TIPO_PRODUCTO = B.ID_TIPO_PRODUCTO AND A.ID_PRODUCTO = C.ID_PRODUCTO AND C.ID_PROVEEDOR = D.ID_PROVEEDOR AND A.ESTADO_PRODUCTO = 5 ";
        if (!strProveedor.isEmpty())
            sql += " AND D.RAZON_SOCIAL = ?";
        if (!strTipoProducto.isEmpty())
            sql += " AND B.DESCRIPCION = ?";
        sql += " ORDER BY 2";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        int cont = 1;
        if (!strProveedor.isEmpty()){
            ps.setString(cont, strProveedor);
            ++cont;
        }
        if (!strTipoProducto.isEmpty()){
            ps.setString(cont, strTipoProducto);
            ++cont;
        }
        ResultSet rs = ps.executeQuery();
        ArrayList<beProducto> productos = new ArrayList<beProducto>();
        beProducto p = null;
        while(rs.next()){
            p = new beProducto();
            p.setIdProducto(rs.getInt(1));
            p.setNombre(rs.getString(2));
            p.setDescTipoProducto(rs.getString(3));
            p.setCosto(rs.getDouble(4));
            p.setNumCajas(rs.getInt(5));
            productos.add(p);
        }
        rs.close();
        ps.close();
        conn.close();
        return productos;
    }

    public ArrayList<beLineaKardex> queryKardexReport(int idProducto, Date fechaDesde, Date fechaHasta) throws Exception{
        String str = "";
        str += "SELECT TABLA.* ";
        str += "FROM( ";
	str += "SELECT 	DATE_TRUNC('SECOND',I.HORA) AS FECHA, ";
        str += "        'INGRESO' AS MOV, ";
        str += "        P.NOMBRE AS PRODUCTO, ";
        str += "        SUM(PA.CANTIDAD_CAJAS) AS CANTIDAD_CAJAS, ";
        str += "        P.STOCK ";
	str += "FROM (LOTEPRODUCTO AS L LEFT JOIN PALLET AS PA ON L.ID_LOTE = PA.ID_LOTE), INGRESO I, PRODUCTO P ";
	str += "WHERE L.ID_INGRESO = I.ID_INGRESO AND L.ID_PRODUCTO = P.ID_PRODUCTO AND P.ID_PRODUCTO = ? ";
        if (fechaDesde != null)
            str += " AND (I.HORA >= ?) ";
        if (fechaHasta != null)
            str += " AND (I.HORA <= ?) ";
	str += "GROUP BY FECHA, MOV, PRODUCTO, STOCK ";
	str += "UNION ";
	str += "SELECT 	DATE_TRUNC('SECOND',UP.FECHASALIDA) AS FECHA, ";
        str += "        'SALIDA' AS MOV, ";
        str += "        P.NOMBRE AS PRODUCTO, ";
        str += "        SUM(PA.CANTIDAD_CAJAS) AS CANTIDAD_CAJAS, ";
        str += "        P.STOCK ";
	str += "FROM ORDEN_DESPACHO O, DATOS_COMBO DC, UBICACION_X_PALLET UP, PALLET PA, LOTEPRODUCTO L, PRODUCTO P ";
	str += "WHERE 	O.ESTADOORDEN = DC.ID_DATO AND ";
        str += "        DC.NOMBRE_DATO = 'Despachado' AND ";
        str += "        UP.FECHASALIDA IS NOT NULL AND ";
        if (fechaDesde != null)
            str += " (UP.FECHASALIDA >= ?) AND ";
        if (fechaHasta != null)
            str += " (UP.FECHASALIDA <= ?) AND";
        str += "        O.ID_ORDEN_DESPACHO = UP.ID_ORDEN_DESPACHO AND ";
        str += "        UP.ID_PALLET = PA.ID_PALLET AND ";
        str += "        PA.ID_LOTE = L.ID_LOTE AND ";
        str += "        L.ID_PRODUCTO = P.ID_PRODUCTO AND ";
        str += "        P.ID_PRODUCTO = ? ";
	str += "GROUP BY FECHA, MOV, PRODUCTO, STOCK ";
        str += "UNION ";
	str += "SELECT 	DATE_TRUNC('SECOND',UP.FECHASALIDA) AS FECHA, ";
        str += "        'SALIDA' AS MOV, ";
        str += "        P.NOMBRE AS PRODUCTO, ";
        str += "        SUM(CANTIDAD_CAJAS) AS CANTIDAD_CAJAS, ";
        str += "        P.STOCK ";
	str += "FROM UBICACION_X_PALLET UP, PALLET PA, LOTEPRODUCTO L, PRODUCTO P ";
	str += "WHERE 	(MOTIVO = 'Incidente' OR MOTIVO = 'Vencimiento') AND ";
        str += "        UP.ID_PALLET = PA.ID_PALLET AND ";
        str += "        PA.ID_LOTE = L.ID_LOTE AND ";
        str += "        L.ID_PRODUCTO = P.ID_PRODUCTO AND P.ID_PRODUCTO = ? ";
	str += "GROUP BY FECHA, MOV, PRODUCTO, STOCK ";
        str += ") AS TABLA ";
        str += "ORDER BY FECHA ASC";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(str);
        int cont = 1;
        ps.setInt(cont, idProducto);
        ++cont;
        if (fechaDesde != null){
            ps.setDate(cont, fechaDesde);
            ++cont;
        }
        if (fechaHasta != null){
            ps.setDate(cont, fechaHasta);
            ++cont;
        }
        if (fechaDesde != null){
            ps.setDate(cont, fechaDesde);
            ++cont;
        }
        if (fechaHasta != null){
            ps.setDate(cont, fechaHasta);
            ++cont;
        }
        ps.setInt(cont, idProducto);
        ++cont;
        ps.setInt(cont, idProducto);
        ++cont;
        ResultSet rs = ps.executeQuery();
        ArrayList<beLineaKardex> lineas = new ArrayList<beLineaKardex>();
        beLineaKardex lk = null;
        while(rs.next()){
            lk = new beLineaKardex();
            lk.setFechaMov(rs.getTimestamp(1));
            lk.setMovimiento(rs.getString(2));
            lk.setProducto(rs.getString(3));
            lk.setNumCajas(rs.getInt(4));
            lk.setStock(rs.getInt(5));
            lineas.add(lk);
        }
        rs.close();
        ps.close();
        conn.close();
        return lineas;
    }

    public ArrayList<beLineaIngresos> queryEntranceReport(Date fechaDesde, Date fechaHasta) throws Exception {
        String sql = "";
        sql += "SELECT 	DATE_TRUNC('SECOND',I.HORA) AS FECHA, ";
	sql += "        P.NOMBRE AS PRODUCTO, ";
	sql += "        CANTIDAD_PRODUCTO*(SELECT COUNT(*) FROM PALLET PA WHERE L.ID_LOTE = PA.ID_LOTE) AS CANTIDAD_CAJA, ";
	sql += "        (SELECT COUNT(*) FROM PALLET PA WHERE L.ID_LOTE = PA.ID_LOTE) AS CANTIDAD_PALLET ";
        sql += "FROM LOTEPRODUCTO L, INGRESO I, PRODUCTO P ";
        sql += "WHERE L.ID_INGRESO = I.ID_INGRESO AND L.ID_PRODUCTO = P.ID_PRODUCTO ";
        if (fechaDesde != null)
            sql += " AND (I.HORA >= ?)";
        if (fechaHasta != null)
            sql += " AND (I.HORA <= ?)";
        sql += "ORDER BY FECHA";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        int cont = 1;
        if (fechaDesde != null){
            ps.setDate(cont, fechaDesde);
            ++cont;
        }
        if (fechaHasta != null){
            ps.setDate(cont,fechaHasta);
            ++cont;
        }
        ResultSet rs = ps.executeQuery();
        ArrayList<beLineaIngresos> lineas = new ArrayList<beLineaIngresos>();
        beLineaIngresos ing = null;
        while(rs.next()){
            ing = new beLineaIngresos();
            ing.setFecha(rs.getTimestamp(1));
            ing.setProducto(rs.getString(2));
            ing.setNumCajas(rs.getInt(3));
            ing.setNumPallets(rs.getInt(4));
            lineas.add(ing);
        }
        rs.close();
        ps.close();
        conn.close();
        return lineas;
    }
}
